package aufgabe2;

import aufgabe1.InterfaceListe;
import aufgabe1.Liste;


public class ImplementationMatrixArrayList implements InterfaceMatrix{

	private InterfaceListe<ImplementationMatrixArrayListElem>[] matrixZeilen;
	
	private int hoehe;
	
	private int breite;
	
	private int zugriffe;
	
	public ImplementationMatrixArrayList(int m, int n){
		hoehe =  m;
		breite = n;
		this.matrixZeilen = new InterfaceListe[m];
		zugriffe = 0;

		for(int n1 = 0; n1 < hoehe; n1++){
			InterfaceListe<ImplementationMatrixArrayListElem> elem = new Liste<ImplementationMatrixArrayListElem>();
			matrixZeilen[n1] = elem;
		}	

	}
	
	@Override
	public int getHoehe() {
		return hoehe;
	}

	@Override
	public int getBreite() {
		return breite;
	}
	
	@Override
	public double getMatrixMN(int m, int n) {
		//System.out.println("Dort");
		InterfaceListe<ImplementationMatrixArrayListElem> temp = matrixZeilen[m];
		InterfaceListe<ImplementationMatrixArrayListElem> temp1 = new Liste<ImplementationMatrixArrayListElem>();
		zugriffe = zugriffe + matrixZeilen[m].getReferenceCounter();
		boolean nichtGefunden = true;
		double wert = 0.0;
		
		while(!temp.isEmpty()){
			ImplementationMatrixArrayListElem tempElem = temp.head();
			temp1.cons(tempElem);
			if(nichtGefunden && tempElem.getPos() == n){
				wert = tempElem.getVal();
				nichtGefunden = false;
			}
		}
		matrixZeilen[m] = temp1;
		return wert;
	}

	@Override
	public void setMatrixMN(int m, int n, double val) {
		//TODO Loeschen alter Elemente
		if(val != 0.0){
			ImplementationMatrixArrayListElem elem = new ImplementationMatrixArrayListElem(n, val);
			InterfaceListe<ImplementationMatrixArrayListElem> temp = matrixZeilen[m];
			temp.insert(elem, 0);	
			matrixZeilen[m] = temp;
		}
		zugriffe++;
	}

	@Override
	public InterfaceMatrix getNewMatrix(int zeilen, int spalten) {
		return new ImplementationMatrixArrayList(zeilen, spalten);
	}
	
	@Override
	public int getReferenceCounter(){
		int zugriffe = 0;
		for (int n = 0; n < hoehe; n++){
			zugriffe = zugriffe + matrixZeilen[n].getReferenceCounter();
		}
		return this.zugriffe + zugriffe;
	}
	
	@Override
	public void resetReferenceCounter(){
		for (int n = 0; n < hoehe; n++){
			matrixZeilen[n].resetReferenceCounter();
		}
		zugriffe = 0;
	}
}
